package com.ny.zmb.openapi.ysutil.utils;

import com.alibaba.fastjson.JSONObject;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 * @author ChenZhiZheng
 * 系统生成的订单号，须保证在商户端不重复
 * 生成规则前8位必须为交易日期，如20220525，
 * 范围跨度支持包含当天在内的前后一天，且只能由大小写英文字母、数字、下划线及横杠组成
 */
public class RequestNoUntil {


    public static void main(String[] args) {
        System.out.println(generateNumericTaskNumber());
    }

    public Object requestNoSetRandomNumber(Object object) {
        JSONObject newObject = JSONObject.parseObject(object.toString());
        if (newObject != null) {
            newObject.putIfAbsent("requestNo", RequestNoUntil.generateNumericTaskNumber());
        }
        return newObject;
    }

    /**
     * 纯数字版本
     *
     * @return 数字
     */
    public static String generateNumericTaskNumber() {
        // 获取当前日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Date currentDate = new Date();
        String datePart = sdf.format(currentDate);

        // 生成随机数字部分
        Random random = new Random();
        StringBuilder randomPart = new StringBuilder();
        int randomLength = 20; // 可以根据需要调整随机部分长度
        for (int i = 0; i < randomLength; i++) {
            randomPart.append(random.nextInt(10));
        }

        return datePart + randomPart.toString();
    }

    /**
     * 英文和数字版本
     *
     * @return 英文和数字
     */
    public static String generateAlphanumericTaskNumber() {
        // 获取当前日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Date currentDate = new Date();
        String datePart = sdf.format(currentDate);

        // 生成随机部分（包含大小写字母、数字、下划线和横杠）
        Random random = new Random();
        StringBuilder randomPart = new StringBuilder();
        int randomLength = 20; // 可调整随机长度
        String validCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";
        for (int i = 0; i < randomLength; i++) {
            int randomIndex = random.nextInt(validCharacters.length());
            randomPart.append(validCharacters.charAt(randomIndex));
        }

        return datePart + randomPart.toString();
    }


}
